package com.cy.pj.service.impl;

import com.cy.pj.Dao.SysRoleDao;
import com.cy.pj.Dao.SysRoleMenuDao;
import com.cy.pj.common.exception业务异常.ServiceException;
import com.cy.pj.common.pojo.CheckBox;
import com.cy.pj.common.pojo.SysRole;
import com.cy.pj.service.SysRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 角色业务对象
 */
@Transactional(readOnly = false,
rollbackFor = Throwable.class,
isolation = Isolation.READ_COMMITTED)
@Service
public class SysRoleServiceImpl implements SysRoleService {
@Autowired
private SysRoleDao sysRoleDao;
@Autowired
    private SysRoleMenuDao sysRoleMenuDao;

@Transactional(readOnly = true)
    @Override
    public List<SysRole> findRoles(SysRole sysRole) {

        return sysRoleDao.selectRole(sysRole);
    }

    /**业务:用户在页面基于id查询到角色和授权菜单的关系
     *实现:基于id，sql映射多表联查
     */
    @Transactional(readOnly = true)
    @Override
    public SysRole findById(Integer id) {

        return sysRoleDao.selectById(id);
    }

    /**业务:用户新增了一条角色信息，又给角色授权了菜单信息
    实现:我们用sql映射获取角色的id值，业务层再获取授权的菜单信息，然后把角色写入到角色表
    ，角色和菜单写入到角色菜单关系表中
*/
    @Transactional //事务控制，启动回滚
    @Override
    public int saveRole(SysRole sysRole) {
        //新增角色自身信息
int row=sysRoleDao.insertRole(sysRole);
//新增角色菜单关系数据
sysRoleMenuDao.insertRoleMenus(sysRole.getId(), sysRole.getMenuIds());
        return row;
    }

    //业务:用户在页面修改了角色和它被授权的菜单
    //实现:先update角色表中的角色信息，再基于id删除原来的角色菜单关系表中的角色关系，最后新增新的角色和菜单的关系信息
    @Transactional
    @Override
    public int updateRole(SysRole sysRole) {
        //1,更新角色自身信息
        int row=sysRoleDao.updateRole(sysRole);
if(row==0)
        throw new ServiceException("记录可能已经不存在了");
        //2,更新角色菜单关系数据(先删再新增)
        //2.1，先删除原有关系
        sysRoleMenuDao.deleteById(sysRole.getId());
        //2.2,在添加新的关系
        sysRoleMenuDao.insertRoleMenus(sysRole.getId(), sysRole.getMenuIds());
        return row;
    }

    @Transactional(readOnly = true)
    @Override
    public List<CheckBox> findCheckRoles() {
        return sysRoleDao.selectCheckRoles();
    }
}
